//
//  ObserverCreateViewController.swift
//  iOS-RxSwift-Tutorials_Example
//
//  Created by mengru.tian on 2020/9/17.
//  Copyright © 2020 CocoaPods. All rights reserved.
//

import UIKit
import RxSwift
import RxCocoa

// 3.Observer - 观察者
class ObserverCreateViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()

        self.title = "Observer - 观察者"
        self.view.backgroundColor = UIColor.white

        testBind4()
    }
    
    // 每个一秒更新一次label文字
    
    // 第一种实现方式：使用bind方法
    func testBind() {
        
        // Observable序列（每隔1秒钟发出一个索引数）
        let observable = Observable<Int>.interval(RxTimeInterval.seconds(1), scheduler: MainScheduler.instance).map { "当前索引数：\($0 )"}
        observable.bind { [weak self](text) in
           //收到发出的索引数后显示到label上
           self?.label.text = text
        }.disposed(by: disposeBag)
    }
    
    // 第二种实现方法：使用AnyObserver
    func testBind2() {
        
        // 观察者
        let observer: AnyObserver<String> = AnyObserver { [weak self] (event) in
            switch event {
            case .next(let text):
                //收到发出的索引数后显示到label上
                self?.label.text = text
            default:
                break
            }
        }
        
        // Observable序列（每隔1秒钟发出一个索引数）
        let observable = Observable<Int>.interval(RxTimeInterval.seconds(1), scheduler: MainScheduler.instance)
        observable
            .map { "当前索引数：\($0 )"}
            .bind(to: observer)
            .disposed(by: disposeBag)
    }
    
    // 第三种实现方法：使用Binder
    func testBind3() {
        // 观察者
        let observer: Binder<String> = Binder(label) { (view, text) in
            //收到发出的索引数后显示到label上
            view.text = text
        }
        
        // Observable序列（每隔1秒钟发出一个索引数）
        let observable = Observable<Int>.interval(RxTimeInterval.seconds(1), scheduler: MainScheduler.instance)
        observable
            .map { "当前索引数：\($0 )"}
            .bind(to: observer)
            .disposed(by: disposeBag)
    }
    
    // 第四种实现方法：使用RxSwift自带的可绑定属性
    func testBind4() {
        
        // Observable序列（每隔1秒钟发出一个索引数）
        let observable = Observable<Int>.interval(RxTimeInterval.seconds(1), scheduler: MainScheduler.instance)
        observable
            .map { "当前索引数：\($0 )"}
            .bind(to: label.rx.text)
            .disposed(by: disposeBag)
    }

}
